import QtQml 2.0

/**
 * This script detects if a GitHub issue url is in the clipboard and downloads the page 
 * so it can parse the headline from it to paste a markdown headline and a link
 */
QtObject {
    /**
     * This function is called when html or a media file is pasted to a note with `Ctrl + Shift + V`
     * 
     * @param text text of the QMimeData object
     * @param html html of the QMimeData object
     * @returns the string that should be inserted instead of the text from the QMimeData object
     */
    function insertingFromMimeDataHook(text, html) {
        text = text.trim();

        // http://www.regexpal.com is your friend
        // check if the pasted text is a GitHub issue url
        var re = /^http[s]?:\/\/github\.com.+\/issues\//igm;
        if (re.test(text)) {
            script.log("found GitHub issue url in clipboard: " + text);

            // download matched GitHub url
            var output = script.downloadUrlToString(text);

            // parse the headline
            var re2 = /<span class="\s*js-issue-title">([^>]+)<\/span>/igm
            var result2 = re2.exec(output);

            if (result2 !== null) {
                var headline = entityToHtml(result2[1].trim());
                script.log("found headline: " + headline);

                // generate markdown to paste
                var result = "## " + headline + "\n- <" + text + ">\n";
                return result;
            }

            script.log("no headline was found!");
        }

        script.log("no GitHub issue url was found");
        return "";
    }

    /**
     * Replaces html entities to characters
     */
    function entityToHtml(string) {
        var entity_table = {
            34: "&quot;",     // Quotation mark. Not required
            38: "&amp;",        // Ampersand. Applied before everything else in the application
            60: "&lt;",     // Less-than sign
            62: "&gt;",     // Greater-than sign
            63: "&#63;",      // Question mark
            111: "&#111;",        // Latin small letter o
            160: "&nbsp;",      // Non-breaking space
            161: "&iexcl;",     // Inverted exclamation mark
            162: "&cent;",      // Cent sign
            163: "&pound;",     // Pound sign
            164: "&curren;",    // Currency sign
            165: "&yen;",       // Yen sign
            166: "&brvbar;",    // Broken vertical bar
            167: "&sect;",      // Section sign
            168: "&uml;",       // Diaeresis
            169: "&copy;",      // Copyright sign
            170: "&ordf;",      // Feminine ordinal indicator
            171: "&laquo;",     // Left-pointing double angle quotation mark
            172: "&not;",       // Not sign
            173: "&shy;",       // Soft hyphen
            174: "&reg;",       // Registered sign
            175: "&macr;",      // Macron
            176: "&deg;",       // Degree sign
            177: "&plusmn;",    // Plus-minus sign
            178: "&sup2;",      // Superscript two
            179: "&sup3;",      // Superscript three
            180: "&acute;",     // Acute accent
            181: "&micro;",     // Micro sign
            182: "&para;",      // Pilcrow sign
            183: "&middot;",    // Middle dot
            184: "&cedil;",     // Cedilla
            185: "&sup1;",      // Superscript one
            186: "&ordm;",      // Masculine ordinal indicator
            187: "&raquo;",     // Right-pointing double angle quotation mark
            188: "&frac14;",    // Vulgar fraction one-quarter
            189: "&frac12;",    // Vulgar fraction one-half
            190: "&frac34;",    // Vulgar fraction three-quarters
            191: "&iquest;",    // Inverted question mark
            192: "&Agrave;",    // A with grave
            193: "&Aacute;",    // A with acute
            194: "&Acirc;",     // A with circumflex
            195: "&Atilde;",    // A with tilde
            196: "&Auml;",      // A with diaeresis
            197: "&Aring;",     // A with ring above
            198: "&AElig;",     // AE
            199: "&Ccedil;",    // C with cedilla
            200: "&Egrave;",    // E with grave
            201: "&Eacute;",    // E with acute
            202: "&Ecirc;",     // E with circumflex
            203: "&Euml;",      // E with diaeresis
            204: "&Igrave;",    // I with grave
            205: "&Iacute;",    // I with acute
            206: "&Icirc;",     // I with circumflex
            207: "&Iuml;",      // I with diaeresis
            208: "&ETH;",       // Eth
            209: "&Ntilde;",    // N with tilde
            210: "&Ograve;",    // O with grave
            211: "&Oacute;",    // O with acute
            212: "&Ocirc;",     // O with circumflex
            213: "&Otilde;",    // O with tilde
            214: "&Ouml;",      // O with diaeresis
            215: "&times;",     // Multiplication sign
            216: "&Oslash;",    // O with stroke
            217: "&Ugrave;",    // U with grave
            218: "&Uacute;",    // U with acute
            219: "&Ucirc;",     // U with circumflex
            220: "&Uuml;",      // U with diaeresis
            221: "&Yacute;",    // Y with acute
            222: "&THORN;",     // Thorn
            223: "&szlig;",     // Sharp s. Also known as ess-zed
            224: "&agrave;",    // a with grave
            225: "&aacute;",    // a with acute
            226: "&acirc;",     // a with circumflex
            227: "&atilde;",    // a with tilde
            228: "&auml;",      // a with diaeresis
            229: "&aring;",     // a with ring above
            230: "&aelig;",     // ae. Also known as ligature ae
            231: "&ccedil;",    // c with cedilla
            232: "&egrave;",    // e with grave
            233: "&eacute;",    // e with acute
            234: "&ecirc;",     // e with circumflex
            235: "&euml;",      // e with diaeresis
            236: "&igrave;",    // i with grave
            237: "&iacute;",    // i with acute
            238: "&icirc;",     // i with circumflex
            239: "&iuml;",      // i with diaeresis
            240: "&eth;",       // eth
            241: "&ntilde;",    // n with tilde
            242: "&ograve;",    // o with grave
            243: "&oacute;",    // o with acute
            244: "&ocirc;",     // o with circumflex
            245: "&otilde;",    // o with tilde
            246: "&ouml;",      // o with diaeresis
            247: "&divide;",    // Division sign
            248: "&oslash;",    // o with stroke. Also known as o with slash
            249: "&ugrave;",    // u with grave
            250: "&uacute;",    // u with acute
            251: "&ucirc;",     // u with circumflex
            252: "&uuml;",      // u with diaeresis
            253: "&yacute;",    // y with acute
            254: "&thorn;",     // thorn
            255: "&yuml;",      // y with diaeresis
            264: "&#264;",      // Latin capital letter C with circumflex
            265: "&#265;",      // Latin small letter c with circumflex
            338: "&OElig;",     // Latin capital ligature OE
            339: "&oelig;",     // Latin small ligature oe
            352: "&Scaron;",    // Latin capital letter S with caron
            353: "&scaron;",    // Latin small letter s with caron
            372: "&#372;",      // Latin capital letter W with circumflex
            373: "&#373;",      // Latin small letter w with circumflex
            374: "&#374;",      // Latin capital letter Y with circumflex
            375: "&#375;",      // Latin small letter y with circumflex
            376: "&Yuml;",      // Latin capital letter Y with diaeresis
            402: "&fnof;",      // Latin small f with hook, function, florin
            710: "&circ;",      // Modifier letter circumflex accent
            732: "&tilde;",     // Small tilde
            913: "&Alpha;",     // Alpha
            914: "&Beta;",      // Beta
            915: "&Gamma;",     // Gamma
            916: "&Delta;",     // Delta
            917: "&Epsilon;",   // Epsilon
            918: "&Zeta;",      // Zeta
            919: "&Eta;",       // Eta
            920: "&Theta;",     // Theta
            921: "&Iota;",      // Iota
            922: "&Kappa;",     // Kappa
            923: "&Lambda;",    // Lambda
            924: "&Mu;",        // Mu
            925: "&Nu;",        // Nu
            926: "&Xi;",        // Xi
            927: "&Omicron;",   // Omicron
            928: "&Pi;",        // Pi
            929: "&Rho;",       // Rho
            931: "&Sigma;",     // Sigma
            932: "&Tau;",       // Tau
            933: "&Upsilon;",   // Upsilon
            934: "&Phi;",       // Phi
            935: "&Chi;",       // Chi
            936: "&Psi;",       // Psi
            937: "&Omega;",     // Omega
            945: "&alpha;",     // alpha
            946: "&beta;",      // beta
            947: "&gamma;",     // gamma
            948: "&delta;",     // delta
            949: "&epsilon;",   // epsilon
            950: "&zeta;",      // zeta
            951: "&eta;",       // eta
            952: "&theta;",     // theta
            953: "&iota;",      // iota
            954: "&kappa;",     // kappa
            955: "&lambda;",    // lambda
            956: "&mu;",        // mu
            957: "&nu;",        // nu
            958: "&xi;",        // xi
            959: "&omicron;",   // omicron
            960: "&pi;",        // pi
            961: "&rho;",       // rho
            962: "&sigmaf;",    // sigmaf
            963: "&sigma;",     // sigma
            964: "&tau;",       // tau
            965: "&upsilon;",   // upsilon
            966: "&phi;",       // phi
            967: "&chi;",       // chi
            968: "&psi;",       // psi
            969: "&omega;",     // omega
            977: "&thetasym;",  // Theta symbol
            978: "&upsih;",     // Greek upsilon with hook symbol
            982: "&piv;",       // Pi symbol
            8194: "&ensp;",     // En space
            8195: "&emsp;",     // Em space
            8201: "&thinsp;",   // Thin space
            8204: "&zwnj;",     // Zero width non-joiner
            8205: "&zwj;",      // Zero width joiner
            8206: "&lrm;",      // Left-to-right mark
            8207: "&rlm;",      // Right-to-left mark
            8211: "&ndash;",    // En dash
            8212: "&mdash;",    // Em dash
            8216: "&lsquo;",    // Left single quotation mark
            8217: "&rsquo;",    // Right single quotation mark
            8218: "&sbquo;",    // Single low-9 quotation mark
            8220: "&ldquo;",    // Left double quotation mark
            8221: "&rdquo;",    // Right double quotation mark
            8222: "&bdquo;",    // Double low-9 quotation mark
            8224: "&dagger;",   // Dagger
            8225: "&Dagger;",   // Double dagger
            8226: "&bull;",     // Bullet
            8230: "&hellip;",   // Horizontal ellipsis
            8240: "&permil;",   // Per mille sign
            8242: "&prime;",    // Prime
            8243: "&Prime;",    // Double Prime
            8249: "&lsaquo;",   // Single left-pointing angle quotation
            8250: "&rsaquo;",   // Single right-pointing angle quotation
            8254: "&oline;",    // Overline
            8260: "&frasl;",    // Fraction Slash
            8364: "&euro;",     // Euro sign
            8472: "&weierp;",   // Script capital
            8465: "&image;",    // Blackletter capital I
            8476: "&real;",     // Blackletter capital R
            8482: "&trade;",    // Trade mark sign
            8501: "&alefsym;",  // Alef symbol
            8592: "&larr;",     // Leftward arrow
            8593: "&uarr;",     // Upward arrow
            8594: "&rarr;",     // Rightward arrow
            8595: "&darr;",     // Downward arrow
            8596: "&harr;",     // Left right arrow
            8629: "&crarr;",    // Downward arrow with corner leftward. Also known as carriage return
            8656: "&lArr;",     // Leftward double arrow. ISO 10646 does not say that lArr is the same as the 'is implied by' arrow but also does not have any other character for that function. So ? lArr can be used for 'is implied by' as ISOtech suggests
            8657: "&uArr;",     // Upward double arrow
            8658: "&rArr;",     // Rightward double arrow. ISO 10646 does not say this is the 'implies' character but does not have another character with this function so ? rArr can be used for 'implies' as ISOtech suggests
            8659: "&dArr;",     // Downward double arrow
            8660: "&hArr;",     // Left-right double arrow
            // Mathematical Operators
            8704: "&forall;",   // For all
            8706: "&part;",     // Partial differential
            8707: "&exist;",    // There exists
            8709: "&empty;",    // Empty set. Also known as null set and diameter
            8711: "&nabla;",    // Nabla. Also known as backward difference
            8712: "&isin;",     // Element of
            8713: "&notin;",    // Not an element of
            8715: "&ni;",       // Contains as member
            8719: "&prod;",     // N-ary product. Also known as product sign. Prod is not the same character as U+03A0 'greek capital letter pi' though the same glyph might be used for both
            8721: "&sum;",      // N-ary summation. Sum is not the same character as U+03A3 'greek capital letter sigma' though the same glyph might be used for both
            8722: "&minus;",    // Minus sign
            8727: "&lowast;",   // Asterisk operator
            8729: "&#8729;",    // Bullet operator
            8730: "&radic;",    // Square root. Also known as radical sign
            8733: "&prop;",     // Proportional to
            8734: "&infin;",    // Infinity
            8736: "&ang;",      // Angle
            8743: "&and;",      // Logical and. Also known as wedge
            8744: "&or;",       // Logical or. Also known as vee
            8745: "&cap;",      // Intersection. Also known as cap
            8746: "&cup;",      // Union. Also known as cup
            8747: "&int;",      // Integral
            8756: "&there4;",   // Therefore
            8764: "&sim;",      // tilde operator. Also known as varies with and similar to. The tilde operator is not the same character as the tilde, U+007E, although the same glyph might be used to represent both
            8773: "&cong;",     // Approximately equal to
            8776: "&asymp;",    // Almost equal to. Also known as asymptotic to
            8800: "&ne;",       // Not equal to
            8801: "&equiv;",    // Identical to
            8804: "&le;",       // Less-than or equal to
            8805: "&ge;",       // Greater-than or equal to
            8834: "&sub;",      // Subset of
            8835: "&sup;",      // Superset of. Note that nsup, 'not a superset of, U+2283' is not covered by the Symbol font encoding and is not included.
            8836: "&nsub;",     // Not a subset of
            8838: "&sube;",     // Subset of or equal to
            8839: "&supe;",     // Superset of or equal to
            8853: "&oplus;",    // Circled plus. Also known as direct sum
            8855: "&otimes;",   // Circled times. Also known as vector product
            8869: "&perp;",     // Up tack. Also known as orthogonal to and perpendicular
            8901: "&sdot;",     // Dot operator. The dot operator is not the same character as U+00B7 middle dot
            // Miscellaneous Technical
            8968: "&lceil;",    // Left ceiling. Also known as an APL upstile
            8969: "&rceil;",    // Right ceiling
            8970: "&lfloor;",   // left floor. Also known as APL downstile
            8971: "&rfloor;",   // Right floor
            9001: "&lang;",     // Left-pointing angle bracket. Also known as bra. Lang is not the same character as U+003C 'less than'or U+2039 'single left-pointing angle quotation mark'
            9002: "&rang;",     // Right-pointing angle bracket. Also known as ket. Rang is not the same character as U+003E 'greater than' or U+203A 'single right-pointing angle quotation mark'
            // Geometric Shapes
            9642: "&#9642;",    // Black small square
            9643: "&#9643;",    // White small square
            9674: "&loz;",      // Lozenge
            // Miscellaneous Symbols
            9702: "&#9702;",    // White bullet
            9824: "&spades;",   // Black (filled) spade suit
            9827: "&clubs;",    // Black (filled) club suit. Also known as shamrock
            9829: "&hearts;",   // Black (filled) heart suit. Also known as shamrock
            9830: "&diams;"   // Black (filled) diamond suit
        }

        for (var i in entity_table) {
            for (var i in entity_table) {
                if (i != 38) {
                    string = string.replace(new RegExp(entity_table[i], "g"), String.fromCharCode(i));
                }
            }
            
            string = string.replace(new RegExp("&#(x?)(\\d+);", "g"), function(match, p1, p2, string) {

                return String.fromCharCode(((p1 == 'x') ? parseInt(p2, 16) : p2));

            });

            string = string.replace(new RegExp(entity_table[38], "g"), String.fromCharCode(38));
            return string;
        }
    }
}
